home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / cgazv5n5.arc / XMSGEN.C < prev    next >
C/C++ Source or Header  |  1991-09-23  |  6KB  |  234 lines

  1. /*--- XMSGEN.C --------------------------- Listing 1 ------
  2.  * Core XMS Access Functions called by the other programs
  3.  * by David Babcock
  4.  *
  5.  * Validated for Microsoft and Borland C/C++
  6.  *
  7.  * This file is called by the other files in this article.
  8.  *
  9.  * (c) 1991 C Gazette. Object Code may be used freely,
  10.  * source code may be used if authorship and publication
  11.  * are acknowledged.
  12.  *-------------------------------------------------------*/
  13.  
  14. #include <stdio.h>
  15. #include <dos.h>
  16. #include <limits.h>
  17. #include "xms.h"
  18.  
  19. int    EMBhandle = -1 ;
  20. struct xms_struc_type xms_struc ;
  21. struct ExtMemMoveStruct XMSMoveStruct ;
  22.  
  23. /* prototypes */
  24.  
  25. void          CDECL closeHMA(void);
  26. void          CDECL closeXMS(void);
  27. static int    getXMSversion(void);
  28. int           openHMA(void);
  29. int           openXMS(unsigned int);
  30. void  far *   swapXMSpage(unsigned int);
  31. unsigned long CDECL XMSfunction(unsigned int,
  32.                         unsigned int,unsigned int);
  33.  
  34. unsigned long CDECL XMSfunction ( unsigned int func_no,
  35.             unsigned int dx_or_ds, unsigned int bx_or_si )
  36. {
  37.  
  38.  /* We _cdecl this if using MSC because MSC 6.0
  39.     generated incorrect code with the fastcall
  40.     option. The bug was fixed in 6.00a but we
  41.     can't assume everyone upgraded. */
  42.  
  43.     unsigned int tu ;
  44.     void far *p ;
  45.  
  46.     p = ( void far * ) xms_struc.func ;
  47.  
  48.     asm     push    ds
  49.     asm     push    si
  50.     asm     mov     ax,func_no
  51.     asm     mov     ah,al
  52.     asm     mov     bx,bx_or_si
  53.     asm     mov     si,bx
  54.     asm     mov     dx,dx_or_ds
  55.     asm     mov     ds,dx
  56.     asm     call    dword ptr [p]
  57.     asm     pop     si
  58.     asm     pop     ds
  59.     asm     push    ax
  60.     asm     mov     tu,bx
  61.     xms_struc.ret_bx = tu ;
  62.     asm     mov     tu,dx
  63.     xms_struc.ret_dx = tu ;
  64.     asm     pop     ax
  65. }
  66.  
  67. void CDECL closeXMS ( void )
  68. {
  69.     if ( EMBhandle != -1 )
  70.         XMSfunction ( 0x0A, EMBhandle, 0 ) ;
  71. }
  72.  
  73. static int initXMS ( void )
  74. {
  75. /* Returns XMS version, with major number in high 8 bits
  76.    and minor in low 8 bits; returns 0 if no XMS */
  77.  
  78.     int ret = 0 ;
  79.  
  80.     union REGS regs ;
  81.     struct SREGS sregs ;
  82.  
  83.     regs.x.ax = 0x4300 ;
  84.     int86 ( 0x2F, ®s, ®s ) ;
  85.     if ( regs.h.al == 0x80 )
  86.     {
  87.         /* XMS present */
  88.  
  89.         regs.x.ax = 0x4310 ;
  90.         int86x ( 0x2F, ®s, ®s, &sregs ) ;
  91.  
  92.         xms_struc.func = MK_FP ( sregs.es, regs.x.bx ) ;
  93.         ret = 1 ;
  94.     }
  95.     return ( ret ) ;
  96. }
  97.  
  98. unsigned int basicXMSfunction ( unsigned int func_no,
  99.     unsigned int dx_or_ds, unsigned int bx_or_si )
  100. {
  101.     int ret ;
  102.     ret = XMSfunction ( func_no, dx_or_ds, bx_or_si ) ;
  103.     return ( ret ? 0 : xms_struc.ret_bx & 0x00FF ) ;
  104. }
  105.  
  106. unsigned long dxbxXMSfunction ( unsigned int func_no,
  107.                                 unsigned int handle )
  108. {
  109.     int ret ;
  110.     ret = XMSfunction ( func_no, handle, 0 ) ;
  111.     return ( ret ?
  112.         ((( unsigned long ) xms_struc.ret_dx ) << 16 ) |
  113.             xms_struc.ret_bx :
  114.         ( unsigned long ) ( xms_struc.ret_bx & 0x00FF )) ;
  115. }
  116.  
  117. int GetXMSVersionNumber ( void )
  118. {
  119.     int ret = 0 ;
  120.     if ( initXMS ( ) )
  121.     {
  122.         ret = XMSfunction ( 0, 0, 0 ) ;
  123.         if ( ret > 0x200 )
  124.             ret = 0x200 ; /* for Qualitas XMS driver bug */
  125.     }
  126.     return ( ret ) ;
  127. }
  128.  
  129. int RequestHighMemoryArea ( unsigned int bytes )
  130. {
  131.     return basicXMSfunction ( 1, bytes, 0 ) ;
  132. }
  133.  
  134. int ReleaseHighMemoryArea ( void )
  135. {
  136.     return basicXMSfunction ( 2, 0, 0 ) ;
  137. }
  138.  
  139. int GlobalEnableA20 ( void )
  140. {
  141.     return basicXMSfunction ( 3, 0, 0 ) ;
  142. }
  143.  
  144. int GlobalDisableA20 ( void )
  145. {
  146.     return basicXMSfunction ( 4, 0, 0 ) ;
  147. }
  148.  
  149. int LocalEnableA20 ( void )
  150. {
  151.     return basicXMSfunction ( 5, 0, 0 ) ;
  152. }
  153.  
  154. int LocalDisableA20 ( void )
  155. {
  156.     return basicXMSfunction ( 6, 0, 0 ) ;
  157. }
  158.  
  159. int QueryA20 ( void )
  160. {
  161.     int ret ;
  162.     ret = XMSfunction ( 7, 0, 0 ) ;
  163.     return ( ( xms_struc.ret_bx & 0x00FF ) == 0 ? ret :
  164.         xms_struc.ret_bx & 0x00FF ) ;
  165. }
  166.  
  167. unsigned long QueryFreeExtendedMemory ( void )
  168. {
  169.     int ret ;
  170.     ret = XMSfunction ( 8, 0, 0 ) ;
  171.     return ((((unsigned long) xms_struc.ret_dx ) << 16 ) | ret);
  172. }
  173.  
  174. int AllocateExtendedMemoryBlock ( unsigned int kBytes )
  175. {
  176.     return basicXMSfunction ( 9, kBytes, 0 ) ;
  177. }
  178.  
  179. int FreeExtendedMemoryBlock ( unsigned int handle )
  180. {
  181.     return basicXMSfunction ( 0xA, handle, 0 ) ;
  182. }
  183.  
  184. int MoveExtendedMemoryBlock ( void far *p )
  185. {
  186.     int ret ;
  187.     ret = XMSfunction ( 0xB, FP_SEG(p), FP_OFF(p) ) ;
  188.     return ( ret ? 0 : xms_struc.ret_bx & 0x00FF ) ;
  189. }
  190.  
  191. unsigned long LockExtendedMemoryBlock ( unsigned int handle )
  192. {
  193.     return dxbxXMSfunction ( 0xC, handle ) ;
  194. }
  195.  
  196. int UnlockExtendedMemoryBlock ( unsigned int handle )
  197. {
  198.     return basicXMSfunction ( 0xD, handle, 0 ) ;
  199. }
  200.  
  201. unsigned long GetEMBHandleInformation ( unsigned int handle )
  202. {
  203.     return dxbxXMSfunction ( 0xE, handle ) ;
  204. }
  205.  
  206. int ReallocateExtendedMemoryBlock ( unsigned int handle,
  207.                                     unsigned int size )
  208. {
  209.     int ret ;
  210.     ret = XMSfunction ( 0xF, handle, size ) ;
  211.     return ( ret ? 0 : xms_struc.ret_bx & 0x00FF ) ;
  212. }
  213.  
  214. int RequestUpperMemoryBlock ( unsigned int paragraphs )
  215. {
  216.     int ret ;
  217.     ret = XMSfunction ( 0x10, paragraphs, 0 ) ;
  218.     return ( ret ? 0 : xms_struc.ret_bx & 0x00FF ) ;
  219. }
  220.  
  221. int ReleaseUpperMemoryBlock ( unsigned int segment )
  222. {
  223.     int ret ;
  224.     ret = XMSfunction ( 0x11, segment, 0 ) ;
  225.     return ( ret ? 0 : xms_struc.ret_bx & 0x00FF ) ;
  226. }
  227.  
  228. char *PrintXMSVersionNumber ( unsigned int ver )
  229. {
  230.     static char buf [ 6 ] ;
  231.     sprintf ( buf, "%d%d.%d%d", ver / 4096,
  232.        ( ver % 4096 ) / 256, ( ver % 256 ) / 16, ver % 16 ) ;
  233.     return ( buf ) ;
  234. }